package com.xcm.validator;

import com.xcm.constant.SysAuthorityConstants;
import com.xcm.model.SysAuthority;
import org.apache.commons.lang3.StringUtils;

import java.util.regex.Pattern;

/**
 * 权限相关验证
 *
 * @author 林强
 * @date 2018-04-12 11:15
 */
public class SysAuthorityValidator {

    /**
     * 正则表达式：验证权限名称（任意字符 ，1-32位）
     */
    public static final String REGEX_AUTHORITY_NAME = "^[\\s\\S]{1,32}$";

    /**
     * 正则表达式：验证权限描述（任意字符 ，1-500位）
     */
    public static final String REGEX_AUTHORITY_DESC = "^[\\s\\S]{1,500}$";

    /**
     * 正则表达式：验证权限标志（英文 ，1-30位）
     */
    public static final String REGEX_AUTHORITY_SIGN = "^[a-zA-Z]{1,30}$";

    /**
     * 正则表达式：验证权限排序号（数字 ，1-4位）
     */
    public static final String REGEX_SORT_NUM = "^\\+?[1-9][0-9]{0,3}$";

    /**
     * 正则表达式：验证权限链接地址（任意字符 ，1-255位）
     */
    public static final String REGEX_URL = "^[\\s\\S]{1,255}$";

    /**
     * 正则表达式：验证权限标签样式（数字字母下划线 ，1-255位）
     */
    public static final String REGEX_CLASSES = "^\\w{1,255}$";

    /**
     * 正则表达式：验证icon（英文数字或空格或特殊字符(包括-_.)1-50位）
     */
    public static final String REGEX_ICON = "^[\\da-zA-Z \\-_.]{1,50}$";

    /**
     * 校验权限名称
     *
     * @param authorityName
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isAuthorityName(String authorityName) {
        return Pattern.matches(REGEX_AUTHORITY_NAME, authorityName);
    }

    /**
     * 校验权限描述
     *
     * @param authorityDesc
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isAuthorityDesc(String authorityDesc) {
        return Pattern.matches(REGEX_AUTHORITY_DESC, authorityDesc);
    }

    /**
     * 校验权限标志
     *
     * @param sign
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isSign(String sign) {
        return Pattern.matches(REGEX_AUTHORITY_SIGN, sign);
    }

    /**
     * 校验权限排序号
     *
     * @param sortNum
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isSortNum(String sortNum) {
        return Pattern.matches(REGEX_SORT_NUM, sortNum);
    }

    /**
     * 校验权限链接地址
     *
     * @param url
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isUrl(String url) {
        return Pattern.matches(REGEX_URL, url);
    }

    /**
     * 校验权限标签样式
     *
     * @param classes
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isClasses(String classes) {
        return Pattern.matches(REGEX_CLASSES, classes);
    }

    /**
     * 校验权限icon
     *
     * @param icon
     * @return 校验通过返回true，否则返回false
     */
    public static boolean isIcon(String icon) {
        return Pattern.matches(REGEX_ICON, icon);
    }

    /**
     * 检查权限表单数据
     *
     * @param sysAuthority
     * @return 成功返回空字符，失败返回对应的提示语句
     */
    public static String validateSysAuthority(SysAuthority sysAuthority) {
        if (null == sysAuthority) {
            return SysAuthorityConstants.VALIDATE_NO_SYS_AUTHORITY;
        }
        //权限名称为空
        if (StringUtils.isBlank(sysAuthority.getAuthorityName())) {
            return SysAuthorityConstants.VALIDATE_NO_SYS_AUTHORITY_NAME;
        }
        //权限名称格式错误
        if (!isAuthorityName(sysAuthority.getAuthorityName())) {
            return SysAuthorityConstants.VALIDATE_AUTHORITY_NAME_ERROR;
        }
        //权限描述
        if (StringUtils.isNotBlank(sysAuthority.getAuthorityDesc()) && !isAuthorityDesc(sysAuthority.getAuthorityDesc())) {
            return SysAuthorityConstants.VALIDATE_AUTHORITY_DESC_ERROR;
        }
        //权限类型（1系统，2菜单，3按钮）
        if (StringUtils.isBlank(sysAuthority.getType()) || SysAuthorityConstants.SYS_AUTHORITY_TYPE_DEFAULT.equals(sysAuthority.getType())) {
            return SysAuthorityConstants.VALIDATE_NO_SYS_TYPE;
        }
        //如果是系统，sign不能为空
        if (SysAuthorityConstants.SYS_AUTHORITY_TYPE_SYSTEM.equals(sysAuthority.getType())) {
            if (StringUtils.isBlank(sysAuthority.getSign())) {
                return SysAuthorityConstants.VALIDATE_NO_SIGN;
            }
            if (!isSign(sysAuthority.getSign())) {
                return SysAuthorityConstants.VALIDATE_SIGN_ERROR;
            }
        }
        //url链接地址
        if (StringUtils.isNotBlank(sysAuthority.getUrl()) && !isUrl(sysAuthority.getUrl())) {
            return SysAuthorityConstants.VALIDATE_URL_ERROR;
        }
        //classes标签样式
        if (StringUtils.isNotBlank(sysAuthority.getClasses()) && !isClasses(sysAuthority.getClasses())) {
            return SysAuthorityConstants.VALIDATE_CLASSES_ERROR;
        }
        //icon
        if (StringUtils.isNotBlank(sysAuthority.getIcon()) && !isIcon(sysAuthority.getIcon())) {
            return SysAuthorityConstants.VALIDATE_ICON_ERROR;
        }
        //排序号格式错误
        if (null != sysAuthority.getSortNum() && !isSortNum(sysAuthority.getSortNum().toString())) {
            return SysAuthorityConstants.VALIDATE_SORT_NUM_ERROR;
        }
        return "";
    }
}
